﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kanban.Entity;
using System.Data.SqlClient;

namespace Kanban.Repository
{
    public class UsuarioRepository : RepositoryBase
    {
        public void Adicionar(Usuario usuario)
        {
            var parametros = new Dictionary<string, object>();
            parametros.Add("Nome", usuario.Nome);
            parametros.Add("Senha", usuario.Senha);
            int id = Convert.ToInt32(this.Adicionar<Usuario>(parametros));

            usuario.Id = id;
        }

        public void Atualizar(Usuario usuario)
        {
            var parametros = new Dictionary<string, object>();
            parametros.Add("Nome", usuario.Nome);
            this.Atualizar<Usuario>(usuario.Id, parametros);
        }

        public Usuario ObterPorId(int id)
        {
            return this.ObterPorId<Usuario>(id, this.PopularObjeto);
        }

        public Usuario ObterPorNomeSenha(string nome, string senha)
        {
            string sql = @"SELECT Id, Nome, Permissoes FROM [PREFIXO_TABELA]Usuario WHERE Senha = @Senha AND Nome = @Nome";
            var parametros = new Dictionary<string, object>();
            parametros.Add("Nome", nome);
            parametros.Add("Senha", senha);

            return this.Obter<Usuario>(sql, parametros, this.PopularObjeto);
        }

        public bool ConsultarSenhaPorNome(string nome)
        {
            string sql = @"SELECT Id, Nome, Permissoes FROM [PREFIXO_TABELA]Usuario WHERE Senha IS NOT NULL AND Nome = @Nome";
            var parametros = new Dictionary<string, object>();
            parametros.Add("Nome", nome);

            return this.Consultar(sql, parametros);
        }

        public List<Usuario> Listar()
        {
            string sql = "SELECT Id, Nome, Permissoes FROM [PREFIXO_TABELA]Usuario";
            var parametros = new Dictionary<string, object>();

            return this.Listar<Usuario>(sql, parametros, this.PopularObjeto);
        }

        public List<Usuario> ListarPorEquipe(int idEquipe)
        {
            string sql = "SELECT Id, Nome, Permissoes FROM [PREFIXO_TABELA]Usuario u INNER JOIN [PREFIXO_TABELA]EquipeUsuario e ON e.IdUsuario = u.Id WHERE e.IdEquipe = @IdEquipe";
            var parametros = new Dictionary<string, object>();
            parametros.Add("IdEquipe", idEquipe);

            return this.Listar<Usuario>(sql, parametros, this.PopularObjeto);
        }

        public void Remover(int id)
        {
            this.Remover<Usuario>(id);
        }

        private Usuario PopularObjeto(SqlDataReader leitor)
        {
            var usuario = new Usuario();
            usuario.Id = leitor.GetInt32(0);
            usuario.Nome = leitor.GetString(1);
            usuario.Permissoes = leitor.GetString(2);
            

            return usuario;
        }

        public Usuario ObterPorNome(string nome)
        {
            string sql = @"SELECT Id, Nome, Permissoes FROM [PREFIXO_TABELA]Usuario WHERE Nome = @Nome";
            var parametros = new Dictionary<string, object>();
            parametros.Add("Nome", nome);

            return this.Obter<Usuario>(sql, parametros, this.PopularObjeto);
        }

        public void AtualizarSenha(int id, string senha)
        {         
            var parametros = new Dictionary<string, object>();
            parametros.Add("Senha", senha);
            this.Atualizar<Usuario>(id, parametros);        
        }

        public bool ConsultarSePodeVerQuadro(string nomeUsuario, int idQuadro)
        {
            string sql = @"DECLARE @IdUsuario INT
                           DECLARE @IsMaster BIT

                           SET @IsMaster = 0

                           SELECT @IdUsuario = Id FROM [PREFIXO_TABELA]Usuario WHERE Nome = @Nome
         

                           IF EXISTS(SELECT * FROM [PREFIXO_TABELA]Usuario WHERE Nome = @Nome AND Permissoes LIKE '%Master%') BEGIN
                             SET @IsMaster = 1
                           END
                         

                            SELECT * FROM [PREFIXO_TABELA]Quadro q 
                            LEFT JOIN [PREFIXO_TABELA]Equipe e
                            ON q.IdEquipe = e.Id
                            LEFT JOIN [PREFIXO_TABELA]EquipeUsuario p
                            ON p.IdEquipe = e.Id AND p.IdUsuario = @IdUsuario
                            WHERE q.Id = @IdQuadro
                            AND (p.IdUsuario IS NOT NULL OR e.IdUsuario = @IdUsuario OR @IsMaster = 1 OR (q.IdUsuario = @IdUsuario AND q.IdEquipe = 0))";

            var parametros = new Dictionary<string, object>();
            parametros.Add("Nome", nomeUsuario);
            parametros.Add("IdQuadro", idQuadro);

            return this.Consultar(sql, parametros);
        }
    }
}